//! 示例: STM32F103 上用 PC13 驱动板载 LED 闪烁
//!
//! 作者: 许可 <paokuai19@163.com>
//! 许可证: Apache-2.0
//!
//! 说明:
//! - 使用 `stm32f1xx-hal` 初始化时钟与外设
//! - 使用 `Timer::syst` 获取基于 SysTick 的毫秒延时
//! - 将 `PC13` 配置为推挽输出, 周期性拉低/拉高实现闪烁
//! - `panic-halt` 在出现 panic 时停机

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_halt as _;
use stm32f1xx_hal::{
    pac,
    prelude::*,
    timer::Timer,
};

#[entry]
fn main() -> ! {
    // 取得设备外设句柄 (单例)
    let dp = pac::Peripherals::take().unwrap();
    let mut flash = dp.FLASH.constrain();
    let rcc = dp.RCC.constrain();

    // 配置并“冻结”时钟, 得到 `clocks` 供外设使用
    let clocks = rcc.cfgr.freeze(&mut flash.acr);

    // 分裂 GPIOC, 将 PC13 配置为推挽输出
    let mut gpioc = dp.GPIOC.split();
    let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);

    // 基于 SysTick 的阻塞延时 (ms)
    let mut delay = Timer::syst(cortex_m::Peripherals::take().unwrap().SYST, &clocks).delay();

    loop {
        // PC13 低电平点亮 (部分开发板为反向)
        led.set_low();
        delay.delay_ms(500_u16);
        // 熄灭
        led.set_high();
        delay.delay_ms(500_u16);
    }
}
